*			  ==========================================
*						     Stata公开课 
*  
*                           软件及计量基础   
*             ==========================================

*                    	 主讲人：候丹丹
*                   	 主办方：连享会（www.lianxh.cn）
*           课程主页：https://gitee.com/lianxh/stataopen
*                     :: 课件下载，答疑等 ::

*			       ============================
*					 	第五讲 回归分析（二）   
*                  ============================

**-注意：执行后续命令之前，请先执行如下几条命令

  global Path 	"`c(sysdir_stata)'ado\personal\open5_regress"  //定义课程路径 
  global D		"$Path\data"		//范例数据
  global Ref	"$Path\ref"		//范例数据  
  cd "$D"     
  set scheme s2color  //设定图形格式为默认格式
  
  *-note: 
  /*	`c(sysdir_stata)'是一个暂元，里面存放了Stata的安装路径：
	输入 sysdir 后显示的第一个文件路径。
	例如, 我的 stata17存放于D盘study文件下, 
	所以, `c(sysdir_stata)' = D:\study\Stata17\     	*/

	

  * ===== 学习过程遇到问题怎么办？====
  *
  * ❓ 提问前，先用 -lianxh- 或 -songbl- 命令搜索相关资料和推文
      ssc install lianxh,replace
	  ssc install songbl,replace
      lianxh DID 倍分法
      songbl 面板
	  help lianxh 
      help songbl	  
  * ❓ 亦可，前往课程主页 https://gitee.com/arlionn/PX --> wiki 
  *   查看 FAQs，通常都能找到答案。 
  *
  
*----------------
*   本讲目录  
*----------------
* 5.1 虚拟变量
* 5.2 交乘项




*			  ==========================================
*						     Stata公开课 
*  
*                           软件及计量基础   
*             ==========================================

*                    	 主讲人：候丹丹
*                   	 主办方：连享会（www.lianxh.cn）
*           课程主页：https://gitee.com/lianxh/stataopen
*                     :: 课件下载，答疑等 ::

*			       ============================
*					 	第五讲 回归分析（二）   
*                  ============================
*					    -5.1- 虚拟变量
*  
*-5.1.1- 如何生成虚拟变量

*	虚拟变量：以反映质的属性的一个人工变量，通常取值为0或1。
	use union.dta, clear
	
	gen union2=0
	replace union2=1 if union=="Union"  //手动生成
	
	tab ind
	tab ind, gen(dum_)   //自动生成
	
*	回归中不需要手动生成，添加i.year  i.union即可  
	
*-5.1.2- 虚拟变量陷阱
	
*	在包含常数项的回归中，添加的虚拟变量个数 = 类别个数 - 1
*	在不包含常数项的回归中，虚拟变量的个数 = 类别的个数

	sysuse nlsw88.dta, clear
	tab ind
	tab ind, gen(dum_)
	reg wage hours dum_*
	est sto m1
	reg wage hours dum_*, nocons
	est sto m2
	esttab m1 m2
	
	reg wage hours i.ind
	est sto m3
	reg wage hours bn.ind, nocons
	est sto m4
	esttab m3 m4	
	
*-5.1.3- 虚拟变量的使用和解读
*-5.1.3.1- 变截距模型
	sysuse "nlsw88.dta", clear
	sum
	drop if union==.
	rename union D
	tabstat wage, by(D) format(%4.3f)  //工会与非工会成员的平均工资	
	reg wage 
	reg wage D
	
	reg wage hours D   //虚拟变量的系数反应的是组别之间截距项的差异
	
*-5.1.3.2- 截距和斜率同时变模型
    sysuse "nlsw88.dta", clear
	rename union D
    gen D_x_hours = D*hours     //产生交乘项
	
	reg wage D hours D_x_hours
	lincom  hours + D_x_hours	 //检验工会成员的 d(wage)/d(hours) 是否显著
	
	replace age=age-39
	global cx "age tenure ttl_exp married south" //控制变量
	reg wage D hours D_x_hours $cx	
	
	reg wage D##c.hours $cx    //无需产生交乘项	
	

*-----------------------
*	更多资料
	lianxh 虚拟变量
*	Stata：虚拟变量专题-生成与使用
	view browse "https://www.lianxh.cn/news/c310d5cfdb634.html"	









 
*			  ==========================================
*						     Stata公开课 
*  
*                           软件及计量基础   
*             ==========================================

*                    	 主讲人：候丹丹
*                   	 主办方：连享会（www.lianxh.cn）
*           课程主页：https://gitee.com/lianxh/stataopen
*                     :: 课件下载，答疑等 ::

*			       ============================
*					 	第五讲 回归分析（二）   
*                  ============================
*					        -5.2- 交乘项
*  
*-5.2.1- 交乘项的简介

  *		y = a + b1*X +e		(1)
  *
  * dy/dX = b1

  *     y = a + b1*X + b2*Z + b3*(X*Z) + e	(2)
  *
  * dy/dX = b1 + b3*Z   i.e., X 的边际效果依赖于 Z
	
  *  若 b1 和 b3 符号相同, 则表明随着 Z 的增加，X 对 y 的边际影响得以"加强";
  *  若 b1 和 b3 符号不同, 则表明随着 Z 的增加，X 对 y 的边际影响会"减弱";
  
  
  *  ----------
  *-Notes:
  * ① 交乘项模型由(1)和(2)两个模型构成, 模型(1)为基准模型，模型(2)为交互项模型;单纯就模型(2)谈论交互项模型会产生偏误；
  * ② 关注的系数有 b1 和 b3 两个；
  * ③ 调节变量(Z) 可以是连续变量，也可以是虚拟变量。

  
  
*-5.2.2- 交乘项的解读

*-5.2.2.1- 案例		盈利能力对负债率的影响
  
  * 理论背景：Trade-off (TO) v.s.  Pecking Order (PO)
  *
  * TO: 盈利能力越强，借债能力越强。预期盈利能力 (NPR) 与 负债率 (TL) 正相关；
  *
  * PO：盈利能力越强，越不需要举债。预期盈利能力 (NPR) 与 负债率 (TL) 负相关；
  *
  * 上述关系有可能随着公司规模(SIZE,衡量信息不对称程度) 的不同而发生变化
  
	  use "xtcs.dta", clear
	  d                 //变量界定
	  global zz "tang fr ndts L.tobin i.year" //控制变量
	  
	  reg tl npr size $zz, robust
	  
	  gen npr_x_size = npr*size   //交乘项
	  reg tl npr size npr_x_size $zz, robust
	   *-or
	  reg tl c.npr##c.size $zz, robust

*-5.2.2.1- 图示		盈利能力对负债率的影响

	*-手动绘图
	  *--------------------------------------
	   sum size
	   local min:  dis %4.1f r(min)
	   local max:  dis %4.1f r(max)
	   local mean: dis %4.1f r(mean)
	   #delimit ;
	   twoway function y = 1.73-0.1*x, 
	          range(`min' `max')
			  xtitle("Size") 
			  ytitle("npr 对 TL 的边际影响") 
	          ylabel(-0.8(0.1)0.1, angle(0) format(%3.1f) grid)  
			  yline(0, lcolor(red) lpattern(dash))
			  xlabel(16 " " 
			         `min'  "Min (`min')"    
			         `mean' "Mean (`mean')"    
					 `max'  "Max (`max')" 
                     26 "  ") 
			  ;
	   #delimit cr	  
	  *-----------------------------------------------------
	  
	*-使用 margin 命令分析边际效应 (推荐使用)
	  *------------------------------  
	    use "xtcs.dta", clear
	    global zz "tang fr ndts L.tobin i.year" //控制变量	  
	    reg tl npr size c.npr#c.size $zz, robust
	    keep if e(sample)
		
	    sum size
	    local min:  dis %4.1f r(min)
	    local max:  dis %4.1f r(max)
		margins, dydx(npr) at(size=(`min' 19.5(0.5)24 `max'))
		*-绘图,附带 95% 置信区间
		marginsplot, ylabel(-1(0.1)0.1,angle(0) format(%2.1f))   ///
		   yline(0, lpattern(dash) lcolor(red))
	  *------------------------------ 

	*-使用 interflex 命令进行更为详细的图形呈现	  
	  *-------------------------------------------	
	    use "xtcs.dta", clear
	    gen Ltobin = L.tobin
	    qui tab year, gen(yr)
	    drop yr1  //防止完全共线性
	    global zz "tang fr ndts Ltobin yr*" //控制变量	  
	    reg tl npr size c.npr#c.size $zz, robust //这两行是为了删除缺漏值
	    keep if e(sample)
	  
	    interflex tl npr size $zz, vce(robust) type(linear) ///
	       ylab("负债率") dlab("净利润率") xlab("公司规模(lnTA)")
        graph export "interflex_fig.wmf", replace  //保存图片
	  *-Note:
	  * (1) 主回归方程中并未包含交乘项，而是通过选项控制的
	  * (2) dlab() 中填写主要解释变量，本例中为 npr
	  *     xlab() 中填写调节变量，本例中为 size
	  * (3) 该命令暂不出支持 L.x 写法，即不支持因子变量写法, 需要自己生成	
	  *------------------------------ 


*-5.2.3- 交乘项的注意事项

*-5.2.3.1-主效应项系数的方向和显著性重要么？

*	不重要
	
  *		y = a + b1*X +e		(1)
  *
  * dy/dX = b1		b1的含义：X的变动平均会带来y的变动

  *     y = a + b1*X + b2*Z + b3*(X*Z) + e	(2)
  *
  * dy/dX = b1 + b3*Z   b1的含义：当Z=0时, X的变动平均会带来y的变动
  
  	shellout "$Ref\jia2015.pdf"  //Table2

*-5.2.3.2- 主效应项要不要？

*	引入主效应项是为了区分截距，而引入交乘项是为了区分斜率。
	
*	情况1: 类别变量相互交乘：
*		   可以去掉主效应项，但系数含义不同。
	sysuse "nlsw88", clear
	d
	reg wage i.union##i.race
	est sto m1
	reg wage i.race i.union#i.race
	est sto m2
	esttab m1 m2
/*
--------------------------------------------
                      (1)             (2)   
                     wage            wage   
--------------------------------------------

1.union             1.154***                
                   (4.34)                   

2.race             -1.614***       -1.614***
                  (-6.42)         (-6.42)   

3.race              1.881           1.881   
                   (1.83)          (1.83)   

1.union#1.~e            0           1.154***
                      (.)          (4.34)   

1.union#2.~e        1.493**         2.646***
                   (3.12)          (6.67)   

1.union#3.~e       -3.141          -1.987   
                  (-1.76)         (-1.13)   

_cons               7.582***        7.582***
                  (60.32)         (60.32)   
--------------------------------------------
N                    1878            1878   
--------------------------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001
 */


*	情况2: 类别变量与连续型变量相互交乘：
*		  （1）可以去掉连续型变量主效应项，但系数含义发生改变；
*		  （2）一般情况下，不可以去掉类别变量主效应项
	reg wage i.union##c.hours
	est sto m3
	reg wage i.union i.union#c.hours 
	est sto m4
	reg wage c.hours i.union#c.hours
	est sto m5
	esttab m3 m4 m5
	
	reg wage c.hours i.union#c.hours	//识别错误
	margins union, at(hours=(1(10)80))
	marginsplot, recast(line) noci 
	
/*
------------------------------------------------------------
                      (1)             (2)             (3)   
                     wage            wage            wage   
------------------------------------------------------------ 

1.union             4.394***        4.394***                
                   (4.75)          (4.75)                   

hours              0.0695***                       0.0480***
                   (6.56)                          (4.98)   

0.union#c.~s            0          0.0695***            0   
                      (.)          (6.56)             (.)   

1.union#c.~s      -0.0782***     -0.00872          0.0299***
                  (-3.34)         (-0.42)          (5.36)   

_cons               4.618***        4.618***        5.480***
                  (11.28)         (11.28)         (14.84)   
------------------------------------------------------------
N                    1877            1877            1877   
------------------------------------------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001
 */

	
*	情况3: 连续型变量与连续型变量相互交乘：
*		   一般情况下，不可以去掉主效应项
	reg wage c.ttl_exp##c.hours
	margins, at(ttl_exp=(3 28) hours=(1(10)80)) vsquish
	marginsplot, noci x(ttl_exp) recast(line)
	
	reg wage c.hours c.hours#c.ttl_exp   //模型可能存在设定问题
	margins, at(ttl_exp=(3 28) hours=(1(10)80)) vsquish
	marginsplot, noci x(ttl_exp) recast(line)	
	
	
*-5.2.3.3- 中心化？共线性？
	sysuse auto, clear
	reg price mpg
	est store m1
	reg price c.mpg##c.wei  //基本回归+交乘项
	est store m2
	esttab m1 m2
	
	center mpg wei, prefix(C_)
	
	reg price mpg wei c.C_mpg#c.C_wei  //只对交乘项去心
	est store m3
	reg price c.C_mpg##c.C_wei  //对主变量、调节变量和交乘项都做去心
	est store m4
	esttab m1 m2 m3 m4, mtitle(ols nocenter center_inter center_all)
	
  *  ----------
  *-Notes: 
  *-	中心化仅是方便一次项系数的解释，不能克服共线性，也不能解决内生性;
  *-	只关注交乘项的系数，中心化与否均可;
  *-	虚拟变量无需中心化	

*-5.2.3.4- 交互项？分组回归？

*	分组回归	宋弘和陆毅(2020)
	shellout "分组.png"
*	交互项	"纪洋等(2018)"	
	shellout "交互项.png"
	
	sysuse auto, clear
	reg price c.weight##c.foreign length gear_ratio  //交互项回归
	est store m1
	
	reg price weight length gear_ratio if foreign == 1  //分组回归
	est store m2a

	reg price weight length gear_ratio if foreign == 0
	est store m2b
	
	esttab m1 m2a m2b

*-	交互项回归中仅要求 wei 变量的系数存在组间差异，对两组控制变量共享一个系数
*-	分组回归放松了假设, 每个变量都存在组间差异。
	
  
*-5.2.3.5- 调节效应？中介效应？

  	shellout "$Ref\江艇2022.pdf" 


*-5.2.4- 交乘项的使用

*	交乘项 ≠ 调节效应, 交乘项 ＞ 调节效应
	shellout "调节效应.pdf"
*-	解读调节效应
	shellout "$Ref\刘志远2017.pdf"

*-	解读分组
	shellout "$Ref\郭瑾2017.pdf"

*-	解读作用机制
	shellout "$Ref\江轩宇2020.pdf"

	
*-----------------------
*	更多资料
	lianxh 交乘项
*-	交乘项专题：主效应项可以忽略吗？
	view browse "https://www.lianxh.cn/news/2ce3c4fbb6d0f.html"	
*-	bilibili 实证会计文献鉴赏
	view browse "https://space.bilibili.com/2018737692"
*-	bilibili 调节效应or异质性分析? 解读江艇老师文章
	view browse "https://www.bilibili.com/video/BV1sY4y1g72R?spm_id_from=333.337.search-card.all.click"



